use axum::Json;
use serde_json::Value;
use sea_orm::{ query::*, sea_query::{ Alias, Expr }, ColumnTrait, EntityTrait };
use crate::query;

pub struct Sorter {
    pub col: Expr,
    pub order: Order
}
pub fn sort<N:EntityTrait, C:ColumnTrait>(param:&Value, e:N, col:C, asc:bool) -> Result<Sorter, Json<Value>>{
    let sort = query::str_op(param, "sort")?;
    let sort_type = query::str_op(param, "sort_type")?;
    if let Some(f) = sort {
        Ok(
            Sorter {
                col: Expr::custom_keyword(Alias::new(format!("{}.{}", e.table_name(), f))),
                order: if sort_type.unwrap_or_default() == "asc" { Order::Asc } else { Order::Desc } 
            }
        )
    }else{
        Ok(
            Sorter {
                col: Expr::col((e, col)),
                order: if asc { Order::Asc } else { Order::Desc }
            }
        )
    }
}
// pub fn sort_ec<N:EntityTrait, C:ColumnTrait>(param:&Value, e:N, col:C, asc:bool) -> Result<Sorter, Json<Value>>{
//     let sort = query::str_op(param, "sort")?;
//     let sort_type = query::str_op(param, "sort_type")?;
//     if let Some(f) = sort {
//         Ok(
//             Sorter {
//                 col: Expr::custom_keyword(Alias::new(&f)),
//                 order: if sort_type.unwrap_or_default() == "asc" { Order::Asc } else { Order::Desc } 
//             }
//         )
//     }else{
//         Ok(
//             Sorter {
//                 col: Expr::col((e, col)),
//                 order: if asc { Order::Asc } else { Order::Desc }
//             }
//         )
//     }
// }
// 置顶
// pub fn top<C:ColumnTrait>(top:C ) -> Expr { Expr::expr(Expr::case(top.eq(1),0).finally(1)) }
// pub fn top<C:ColumnTrait>(top:C ) -> Expr { Expr::expr(top.eq(1)) }